#!/bin/bash

# OneCode RAD 启动脚本 - WSL/Linux 兼容版本
# 支持 Windows 10/11 的 WSL 和原生 Linux 环境

# 设置脚本目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检测运行环境
detect_environment() {
    if [[ -f /proc/version ]] && grep -qi microsoft /proc/version; then
        echo "wsl"
    elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
        echo "linux"
    elif [[ "$OSTYPE" == "darwin"* ]]; then
        echo "macos"
    else
        echo "unknown"
    fi
}

# 检测Java环境
check_java() {
    if command -v java &> /dev/null; then
        JAVA_VERSION=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}' | cut -d'.' -f1)
        log_info "检测到 Java 版本: $(java -version 2>&1 | head -n 1)"
        
        if [[ "$JAVA_VERSION" -ge 8 ]]; then
            return 0
        else
            log_error "需要 Java 8 或更高版本"
            return 1
        fi
    else
        log_error "未找到 Java 环境"
        log_info "请安装 Java 8 或更高版本"
        
        # WSL环境下的Java安装建议
        ENV=$(detect_environment)
        if [[ "$ENV" == "wsl" ]]; then
            log_info "WSL环境下建议安装方式:"
            log_info "  sudo apt update"
            log_info "  sudo apt install openjdk-11-jdk"
        fi
        return 1
    fi
}

# 检查Maven包装器
check_maven_wrapper() {
    if [[ -f "./mvnw" ]]; then
        chmod +x ./mvnw
        log_info "使用 Maven Wrapper"
        return 0
    elif command -v mvn &> /dev/null; then
        log_info "使用系统 Maven"
        return 0
    else
        log_error "未找到 Maven 或 Maven Wrapper"
        return 1
    fi
}

# 构建项目
build_project() {
    log_info "开始构建项目..."
    
    if [[ -f "./mvnw" ]]; then
        ./mvnw clean package -DskipTests
    else
        mvn clean package -DskipTests
    fi
    
    if [[ $? -eq 0 ]]; then
        log_success "项目构建成功"
        return 0
    else
        log_error "项目构建失败"
        return 1
    fi
}

# 启动应用
start_application() {
    log_info "启动 OneCode RAD 应用..."
    
    # 检查JAR文件
    JAR_FILE="target/ROOT.jar"
    if [[ ! -f "$JAR_FILE" ]]; then
        log_error "未找到JAR文件: $JAR_FILE"
        log_info "尝试构建项目..."
        build_project || return 1
    fi
    
    # 设置WSL特定的JVM参数
    ENV=$(detect_environment)
    JVM_ARGS=""
    
    if [[ "$ENV" == "wsl" ]]; then
        log_info "检测到WSL环境，应用WSL优化配置"
        JVM_ARGS="-Djava.awt.headless=true -Dfile.encoding=UTF-8"
        
        # WSL2特定优化
        if [[ -f /proc/version ]] && grep -qi "microsoft.*wsl2" /proc/version; then
            log_info "检测到WSL2，应用网络优化配置"
            JVM_ARGS="$JVM_ARGS -Djava.net.preferIPv4Stack=true"
        fi
    fi
    
    # 设置端口
    PORT=${PORT:-8083}
    log_info "应用将在端口 $PORT 上启动"
    
    # 获取本机IP地址
    get_ip_address() {
        if [[ "$ENV" == "wsl" ]]; then
            # WSL环境下获取Windows主机IP
            ip route show | grep -i default | awk '{ print $3}' | head -n 1
        else
            # Linux环境下获取本机IP
            hostname -I | awk '{print $1}'
        fi
    }
    
    IP_ADDRESS=$(get_ip_address)
    
    # 启动应用
    log_info "启动命令: java $JVM_ARGS -jar $JAR_FILE --server.port=$PORT"
    java $JVM_ARGS -jar "$JAR_FILE" --server.port="$PORT" &
    
    APP_PID=$!
    echo $APP_PID > .app.pid
    
    # 等待应用启动
    log_info "等待应用启动..."
    sleep 5
    
    # 检查应用是否启动成功
    if kill -0 $APP_PID 2>/dev/null; then
        log_success "OneCode RAD 启动成功!"
        log_success "PID: $APP_PID"
        log_success "访问地址:"
        log_success "  本地: http://localhost:$PORT"
        if [[ -n "$IP_ADDRESS" ]]; then
            log_success "  网络: http://$IP_ADDRESS:$PORT"
        fi
        
        if [[ "$ENV" == "wsl" ]]; then
            log_info "WSL提示: 可以在Windows浏览器中直接访问 http://localhost:$PORT"
        fi
        
        log_info "按 Ctrl+C 停止应用"
        wait $APP_PID
    else
        log_error "应用启动失败"
        return 1
    fi
}

# 停止应用
stop_application() {
    if [[ -f ".app.pid" ]]; then
        PID=$(cat .app.pid)
        if kill -0 $PID 2>/dev/null; then
            log_info "停止应用 (PID: $PID)..."
            kill $PID
            rm -f .app.pid
            log_success "应用已停止"
        else
            log_warning "应用未运行"
            rm -f .app.pid
        fi
    else
        log_warning "未找到应用PID文件"
    fi
}

# 显示帮助信息
show_help() {
    echo "OneCode RAD 启动脚本"
    echo ""
    echo "用法: $0 [命令]"
    echo ""
    echo "命令:"
    echo "  start    启动应用 (默认)"
    echo "  stop     停止应用"
    echo "  restart  重启应用"
    echo "  build    构建项目"
    echo "  status   查看应用状态"
    echo "  help     显示帮助信息"
    echo ""
    echo "环境变量:"
    echo "  PORT     指定端口号 (默认: 8083)"
    echo ""
    echo "示例:"
    echo "  $0 start"
    echo "  PORT=9090 $0 start"
    echo "  $0 stop"
}

# 查看应用状态
show_status() {
    if [[ -f ".app.pid" ]]; then
        PID=$(cat .app.pid)
        if kill -0 $PID 2>/dev/null; then
            log_success "应用正在运行 (PID: $PID)"
            
            # 尝试获取端口信息
            if command -v netstat &> /dev/null; then
                PORT_INFO=$(netstat -tlnp 2>/dev/null | grep $PID | head -n 1)
                if [[ -n "$PORT_INFO" ]]; then
                    echo "端口信息: $PORT_INFO"
                fi
            fi
        else
            log_warning "PID文件存在但应用未运行"
            rm -f .app.pid
        fi
    else
        log_info "应用未运行"
    fi
}

# 主函数
main() {
    log_info "OneCode RAD 启动脚本 - WSL/Linux 版本"
    log_info "运行环境: $(detect_environment)"
    
    case "${1:-start}" in
        "start")
            # 检查环境
            check_java || exit 1
            check_maven_wrapper || exit 1
            start_application
            ;;
        "stop")
            stop_application
            ;;
        "restart")
            stop_application
            sleep 2
            check_java || exit 1
            check_maven_wrapper || exit 1
            start_application
            ;;
        "build")
            check_java || exit 1
            check_maven_wrapper || exit 1
            build_project
            ;;
        "status")
            show_status
            ;;
        "help"|"-h"|"--help")
            show_help
            ;;
        *)
            log_error "未知命令: $1"
            show_help
            exit 1
            ;;
    esac
}

# 捕获中断信号
trap 'log_info "收到中断信号，正在停止..."; stop_application; exit 0' INT TERM

# 执行主函数
main "$@"